Don't assume a screen exists before realize()
authorMatthias Clasen <mclasen@redhat.com>
Sat, 5 Feb 2011 03:01:40 +0000 (22:01 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 5 Feb 2011 03:03:11 +0000 (22:03 -0500)
Fix for https://bugzilla.gnome.org/show_bug.cgi?id=641429

gtk/gtkstyle.c
gtk/gtkstylecontext.c
gtk/gtkwidget.c
gtk/gtkwindow.c

index 81105d81dba734ef2452e744dac9eb064a509579..5347119ef05cf3e6e5a5ab64d5192afac74ac7c7 100644 (file)
@@ -813,13 +813,15 @@ gtk_style_copy (GtkStyle *style)
 
 GtkStyle*
 _gtk_style_new_for_path (GdkScreen     *screen,
-                        GtkWidgetPath *path)
+                         GtkWidgetPath *path)
 {
   GtkStyleContext *context;
   GtkStyle *style;
 
   context = gtk_style_context_new ();
-  gtk_style_context_set_screen (context, screen);
+
+  if (screen)
+    gtk_style_context_set_screen (context, screen);
   gtk_style_context_set_path (context, path);
 
   style = g_object_new (GTK_TYPE_STYLE,
@@ -848,8 +850,7 @@ gtk_style_new (void)
   path = gtk_widget_path_new ();
   gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
 
-  style = _gtk_style_new_for_path (gdk_screen_get_default (),
-                                  path);
+  style = _gtk_style_new_for_path (gdk_screen_get_default (), path);
 
   gtk_widget_path_free (path);
 
index 7cd0dab1c1650150bc6b85331b0ebfad38978564..6eed378d0eb0767bf2c50e38b566ae06195c3daa 100644 (file)
@@ -2617,7 +2617,7 @@ gtk_style_context_set_screen (GtkStyleContext *context,
   GtkStyleContextPrivate *priv;
 
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
-  g_return_if_fail (GDK_IS_SCREEN (screen));
+  g_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen));
 
   priv = context->priv;
   if (priv->screen == screen)
index 74d83f21ce5f5e4aa0aa2186f8a50df0d02adb31..f7e5383a380a69cada7509b30881e7e476d19f9b 100644 (file)
@@ -14179,7 +14179,7 @@ gtk_widget_get_style_context (GtkWidget *widget)
                         G_CALLBACK (style_context_changed), widget);
 
       gtk_style_context_set_screen (widget->priv->context,
-                                    gtk_widget_get_screen (widget));
+                                    gtk_widget_get_screen_unchecked (widget));
 
       _gtk_widget_update_path (widget);
       gtk_style_context_set_path (widget->priv->context,
index 5696c196ec081803971761fe130267d0a1b6be88..7336d025d89e86162732016332fb172be8bc4088 100644 (file)
@@ -1108,8 +1108,9 @@ gtk_window_init (GtkWindow *window)
   priv->has_user_ref_count = TRUE;
   toplevel_list = g_slist_prepend (toplevel_list, window);
 
-  g_signal_connect (priv->screen, "composited-changed",
-                   G_CALLBACK (gtk_window_on_composited_changed), window);
+  if (priv->screen)
+    g_signal_connect (priv->screen, "composited-changed",
+                      G_CALLBACK (gtk_window_on_composited_changed), window);
 }
 
 static void
@@ -7961,7 +7962,7 @@ gtk_window_set_screen (GtkWindow *window,
   GtkWidget *widget;
   GdkScreen *previous_screen;
   gboolean was_mapped;
-  
+
   g_return_if_fail (GTK_IS_WINDOW (window));
   g_return_if_fail (GDK_IS_SCREEN (screen));
 
@@ -7979,17 +7980,18 @@ gtk_window_set_screen (GtkWindow *window,
     gtk_widget_unmap (widget);
   if (gtk_widget_get_realized (widget))
     gtk_widget_unrealize (widget);
-      
+
   gtk_window_free_key_hash (window);
   priv->screen = screen;
   gtk_widget_reset_rc_styles (widget);
   if (screen != previous_screen)
     {
-      g_signal_handlers_disconnect_by_func (previous_screen,
-                                           gtk_window_on_composited_changed, window);
-      g_signal_connect (screen, "composited-changed", 
-                       G_CALLBACK (gtk_window_on_composited_changed), window);
-      
+      if (previous_screen)
+        g_signal_handlers_disconnect_by_func (previous_screen,
+                                              gtk_window_on_composited_changed, window);
+      g_signal_connect (screen, "composited-changed",
+                        G_CALLBACK (gtk_window_on_composited_changed), window);
+
       _gtk_widget_propagate_screen_changed (widget, previous_screen);
       _gtk_widget_propagate_composited_changed (widget);
     }